home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / var / lib / python-support / python2.6 / gdata / tlslite / utils / rijndael.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  10.1 KB  |  502 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. '''
  5. A pure python (slow) implementation of rijndael with a decent interface
  6.  
  7. To include -
  8.  
  9. from rijndael import rijndael
  10.  
  11. To do a key setup -
  12.  
  13. r = rijndael(key, block_size = 16)
  14.  
  15. key must be a string of length 16, 24, or 32
  16. blocksize must be 16, 24, or 32. Default is 16
  17.  
  18. To use -
  19.  
  20. ciphertext = r.encrypt(plaintext)
  21. plaintext = r.decrypt(ciphertext)
  22.  
  23. If any strings are of the wrong length a ValueError is thrown
  24. '''
  25. import copy
  26. import string
  27. import os
  28. if os.name != 'java':
  29.     import exceptions
  30.     if hasattr(exceptions, 'FutureWarning'):
  31.         import warnings
  32.         warnings.filterwarnings('ignore', category = FutureWarning, append = 1)
  33.     
  34.  
  35. shifts = [
  36.     [
  37.         [
  38.             0,
  39.             0],
  40.         [
  41.             1,
  42.             3],
  43.         [
  44.             2,
  45.             2],
  46.         [
  47.             3,
  48.             1]],
  49.     [
  50.         [
  51.             0,
  52.             0],
  53.         [
  54.             1,
  55.             5],
  56.         [
  57.             2,
  58.             4],
  59.         [
  60.             3,
  61.             3]],
  62.     [
  63.         [
  64.             0,
  65.             0],
  66.         [
  67.             1,
  68.             7],
  69.         [
  70.             3,
  71.             5],
  72.         [
  73.             4,
  74.             4]]]
  75. num_rounds = {
  76.     16: {
  77.         16: 10,
  78.         24: 12,
  79.         32: 14 },
  80.     24: {
  81.         16: 12,
  82.         24: 12,
  83.         32: 14 },
  84.     32: {
  85.         16: 14,
  86.         24: 14,
  87.         32: 14 } }
  88. A = [
  89.     [
  90.         1,
  91.         1,
  92.         1,
  93.         1,
  94.         1,
  95.         0,
  96.         0,
  97.         0],
  98.     [
  99.         0,
  100.         1,
  101.         1,
  102.         1,
  103.         1,
  104.         1,
  105.         0,
  106.         0],
  107.     [
  108.         0,
  109.         0,
  110.         1,
  111.         1,
  112.         1,
  113.         1,
  114.         1,
  115.         0],
  116.     [
  117.         0,
  118.         0,
  119.         0,
  120.         1,
  121.         1,
  122.         1,
  123.         1,
  124.         1],
  125.     [
  126.         1,
  127.         0,
  128.         0,
  129.         0,
  130.         1,
  131.         1,
  132.         1,
  133.         1],
  134.     [
  135.         1,
  136.         1,
  137.         0,
  138.         0,
  139.         0,
  140.         1,
  141.         1,
  142.         1],
  143.     [
  144.         1,
  145.         1,
  146.         1,
  147.         0,
  148.         0,
  149.         0,
  150.         1,
  151.         1],
  152.     [
  153.         1,
  154.         1,
  155.         1,
  156.         1,
  157.         0,
  158.         0,
  159.         0,
  160.         1]]
  161. alog = [
  162.     1]
  163. for i in xrange(255):
  164.     j = alog[-1] << 1 ^ alog[-1]
  165.     if j & 256 != 0:
  166.         j ^= 283
  167.     
  168.     alog.append(j)
  169.  
  170. log = [
  171.     0] * 256
  172. for i in xrange(1, 255):
  173.     log[alog[i]] = i
  174.  
  175.  
  176. def mul(a, b):
  177.     if a == 0 or b == 0:
  178.         return 0
  179.     return alog[(log[a & 255] + log[b & 255]) % 255]
  180.  
  181. box = [ [
  182.     0] * 8 for i in xrange(256) ]
  183. box[1][7] = 1
  184. for i in xrange(2, 256):
  185.     j = alog[255 - log[i]]
  186.     for t in xrange(8):
  187.         box[i][t] = j >> 7 - t & 1
  188.     
  189.  
  190. B = [
  191.     0,
  192.     1,
  193.     1,
  194.     0,
  195.     0,
  196.     0,
  197.     1,
  198.     1]
  199. cox = [ [
  200.     0] * 8 for i in xrange(256) ]
  201. for i in xrange(256):
  202.     for t in xrange(8):
  203.         cox[i][t] = B[t]
  204.         for j in xrange(8):
  205.             cox[i][t] ^= A[t][j] * box[i][j]
  206.         
  207.     
  208.  
  209. S = [
  210.     0] * 256
  211. Si = [
  212.     0] * 256
  213. for i in xrange(256):
  214.     S[i] = cox[i][0] << 7
  215.     for t in xrange(1, 8):
  216.         S[i] ^= cox[i][t] << 7 - t
  217.     
  218.     Si[S[i] & 255] = i
  219.  
  220. G = [
  221.     [
  222.         2,
  223.         1,
  224.         1,
  225.         3],
  226.     [
  227.         3,
  228.         2,
  229.         1,
  230.         1],
  231.     [
  232.         1,
  233.         3,
  234.         2,
  235.         1],
  236.     [
  237.         1,
  238.         1,
  239.         3,
  240.         2]]
  241. AA = [ [
  242.     0] * 8 for i in xrange(4) ]
  243. for i in xrange(4):
  244.     for j in xrange(4):
  245.         AA[i][j] = G[i][j]
  246.         AA[i][i + 4] = 1
  247.     
  248.  
  249. for i in xrange(4):
  250.     pivot = AA[i][i]
  251.     for j in xrange(8):
  252.         if AA[i][j] != 0:
  253.             AA[i][j] = alog[(255 + log[AA[i][j] & 255] - log[pivot & 255]) % 255]
  254.             continue
  255.         [] if pivot == 0 else []
  256.     
  257.     for t in xrange(4):
  258.         if i != t:
  259.             for j in xrange(i + 1, 8):
  260.                 AA[t][j] ^= mul(AA[i][j], AA[t][i])
  261.             
  262.             AA[t][i] = 0
  263.             continue
  264.         []
  265.     
  266.  
  267. iG = [ [
  268.     0] * 4 for i in xrange(4) ]
  269. for i in xrange(4):
  270.     for j in xrange(4):
  271.         iG[i][j] = AA[i][j + 4]
  272.     
  273.  
  274.  
  275. def mul4(a, bs):
  276.     if a == 0:
  277.         return 0
  278.     r = 0
  279.     for b in bs:
  280.         r <<= 8
  281.         if b != 0:
  282.             r = r | mul(a, b)
  283.             continue
  284.         a == 0
  285.     
  286.     return r
  287.  
  288. T1 = []
  289. T2 = []
  290. T3 = []
  291. T4 = []
  292. T5 = []
  293. T6 = []
  294. T7 = []
  295. T8 = []
  296. U1 = []
  297. U2 = []
  298. U3 = []
  299. U4 = []
  300. for t in xrange(256):
  301.     s = S[t]
  302.     T1.append(mul4(s, G[0]))
  303.     T2.append(mul4(s, G[1]))
  304.     T3.append(mul4(s, G[2]))
  305.     T4.append(mul4(s, G[3]))
  306.     s = Si[t]
  307.     T5.append(mul4(s, iG[0]))
  308.     T6.append(mul4(s, iG[1]))
  309.     T7.append(mul4(s, iG[2]))
  310.     T8.append(mul4(s, iG[3]))
  311.     U1.append(mul4(t, iG[0]))
  312.     U2.append(mul4(t, iG[1]))
  313.     U3.append(mul4(t, iG[2]))
  314.     U4.append(mul4(t, iG[3]))
  315.  
  316. rcon = [
  317.     1]
  318. r = 1
  319. for t in xrange(1, 30):
  320.     r = mul(2, r)
  321.     rcon.append(r)
  322.  
  323. del A
  324. del AA
  325. del pivot
  326. del B
  327. del G
  328. del box
  329. del log
  330. del alog
  331. del i
  332. del j
  333. del r
  334. del s
  335. del t
  336. del mul
  337. del mul4
  338. del cox
  339. del iG
  340.  
  341. class rijndael:
  342.     
  343.     def __init__(self, key, block_size = 16):
  344.         if block_size != 16 and block_size != 24 and block_size != 32:
  345.             raise ValueError('Invalid block size: ' + str(block_size))
  346.         block_size != 32
  347.         if len(key) != 16 and len(key) != 24 and len(key) != 32:
  348.             raise ValueError('Invalid key size: ' + str(len(key)))
  349.         len(key) != 32
  350.         self.block_size = block_size
  351.         ROUNDS = num_rounds[len(key)][block_size]
  352.         BC = block_size / 4
  353.         Ke = [ [
  354.             0] * BC for i in xrange(ROUNDS + 1) ]
  355.         Kd = [ [
  356.             0] * BC for i in xrange(ROUNDS + 1) ]
  357.         ROUND_KEY_COUNT = (ROUNDS + 1) * BC
  358.         KC = len(key) / 4
  359.         tk = []
  360.         for i in xrange(0, KC):
  361.             tk.append(ord(key[i * 4]) << 24 | ord(key[i * 4 + 1]) << 16 | ord(key[i * 4 + 2]) << 8 | ord(key[i * 4 + 3]))
  362.         
  363.         t = 0
  364.         j = 0
  365.         while j < KC and t < ROUND_KEY_COUNT:
  366.             Ke[t / BC][t % BC] = tk[j]
  367.             Kd[ROUNDS - t / BC][t % BC] = tk[j]
  368.             j += 1
  369.             t += 1
  370.             continue
  371.             []
  372.         tt = 0
  373.         rconpointer = 0
  374.         while t < ROUND_KEY_COUNT:
  375.             tt = tk[KC - 1]
  376.             tk[0] ^= (S[tt >> 16 & 255] & 255) << 24 ^ (S[tt >> 8 & 255] & 255) << 16 ^ (S[tt & 255] & 255) << 8 ^ S[tt >> 24 & 255] & 255 ^ (rcon[rconpointer] & 255) << 24
  377.             rconpointer += 1
  378.             j = 0
  379.             while j < KC and t < ROUND_KEY_COUNT:
  380.                 Ke[t / BC][t % BC] = tk[j]
  381.                 Kd[ROUNDS - t / BC][t % BC] = tk[j]
  382.                 j += 1
  383.                 t += 1
  384.                 continue
  385.                 [] if KC != 8 else []
  386.         for r in xrange(1, ROUNDS):
  387.             for j in xrange(BC):
  388.                 tt = Kd[r][j]
  389.                 Kd[r][j] = U1[tt >> 24 & 255] ^ U2[tt >> 16 & 255] ^ U3[tt >> 8 & 255] ^ U4[tt & 255]
  390.             
  391.         
  392.         self.Ke = Ke
  393.         self.Kd = Kd
  394.  
  395.     
  396.     def encrypt(self, plaintext):
  397.         if len(plaintext) != self.block_size:
  398.             raise ValueError('wrong block length, expected ' + str(self.block_size) + ' got ' + str(len(plaintext)))
  399.         len(plaintext) != self.block_size
  400.         Ke = self.Ke
  401.         BC = self.block_size / 4
  402.         ROUNDS = len(Ke) - 1
  403.         if BC == 4:
  404.             SC = 0
  405.         elif BC == 6:
  406.             SC = 1
  407.         else:
  408.             SC = 2
  409.         s1 = shifts[SC][1][0]
  410.         s2 = shifts[SC][2][0]
  411.         s3 = shifts[SC][3][0]
  412.         a = [
  413.             0] * BC
  414.         t = []
  415.         for i in xrange(BC):
  416.             t.append((ord(plaintext[i * 4]) << 24 | ord(plaintext[i * 4 + 1]) << 16 | ord(plaintext[i * 4 + 2]) << 8 | ord(plaintext[i * 4 + 3])) ^ Ke[0][i])
  417.         
  418.         for r in xrange(1, ROUNDS):
  419.             for i in xrange(BC):
  420.                 a[i] = T1[t[i] >> 24 & 255] ^ T2[t[(i + s1) % BC] >> 16 & 255] ^ T3[t[(i + s2) % BC] >> 8 & 255] ^ T4[t[(i + s3) % BC] & 255] ^ Ke[r][i]
  421.             
  422.             t = copy.copy(a)
  423.         
  424.         result = []
  425.         for i in xrange(BC):
  426.             tt = Ke[ROUNDS][i]
  427.             result.append((S[t[i] >> 24 & 255] ^ tt >> 24) & 255)
  428.             result.append((S[t[(i + s1) % BC] >> 16 & 255] ^ tt >> 16) & 255)
  429.             result.append((S[t[(i + s2) % BC] >> 8 & 255] ^ tt >> 8) & 255)
  430.             result.append((S[t[(i + s3) % BC] & 255] ^ tt) & 255)
  431.         
  432.         return string.join(map(chr, result), '')
  433.  
  434.     
  435.     def decrypt(self, ciphertext):
  436.         if len(ciphertext) != self.block_size:
  437.             raise ValueError('wrong block length, expected ' + str(self.block_size) + ' got ' + str(len(plaintext)))
  438.         len(ciphertext) != self.block_size
  439.         Kd = self.Kd
  440.         BC = self.block_size / 4
  441.         ROUNDS = len(Kd) - 1
  442.         if BC == 4:
  443.             SC = 0
  444.         elif BC == 6:
  445.             SC = 1
  446.         else:
  447.             SC = 2
  448.         s1 = shifts[SC][1][1]
  449.         s2 = shifts[SC][2][1]
  450.         s3 = shifts[SC][3][1]
  451.         a = [
  452.             0] * BC
  453.         t = [
  454.             0] * BC
  455.         for i in xrange(BC):
  456.             t[i] = (ord(ciphertext[i * 4]) << 24 | ord(ciphertext[i * 4 + 1]) << 16 | ord(ciphertext[i * 4 + 2]) << 8 | ord(ciphertext[i * 4 + 3])) ^ Kd[0][i]
  457.         
  458.         for r in xrange(1, ROUNDS):
  459.             for i in xrange(BC):
  460.                 a[i] = T5[t[i] >> 24 & 255] ^ T6[t[(i + s1) % BC] >> 16 & 255] ^ T7[t[(i + s2) % BC] >> 8 & 255] ^ T8[t[(i + s3) % BC] & 255] ^ Kd[r][i]
  461.             
  462.             t = copy.copy(a)
  463.         
  464.         result = []
  465.         for i in xrange(BC):
  466.             tt = Kd[ROUNDS][i]
  467.             result.append((Si[t[i] >> 24 & 255] ^ tt >> 24) & 255)
  468.             result.append((Si[t[(i + s1) % BC] >> 16 & 255] ^ tt >> 16) & 255)
  469.             result.append((Si[t[(i + s2) % BC] >> 8 & 255] ^ tt >> 8) & 255)
  470.             result.append((Si[t[(i + s3) % BC] & 255] ^ tt) & 255)
  471.         
  472.         return string.join(map(chr, result), '')
  473.  
  474.  
  475.  
  476. def encrypt(key, block):
  477.     return rijndael(key, len(block)).encrypt(block)
  478.  
  479.  
  480. def decrypt(key, block):
  481.     return rijndael(key, len(block)).decrypt(block)
  482.  
  483.  
  484. def test():
  485.     
  486.     def t(kl, bl):
  487.         b = 'b' * bl
  488.         r = rijndael('a' * kl, bl)
  489.         if not r.decrypt(r.encrypt(b)) == b:
  490.             raise AssertionError
  491.  
  492.     t(16, 16)
  493.     t(16, 24)
  494.     t(16, 32)
  495.     t(24, 16)
  496.     t(24, 24)
  497.     t(24, 32)
  498.     t(32, 16)
  499.     t(32, 24)
  500.     t(32, 32)
  501.  
  502.